#include "mt.h"
int main()
{
	int sock, clientlen, n, newsockfd;
	struct sockaddr_in name, cli_addr;
	char buf[MAX_MSG_LENGTH];
	
	/* Crear socket sobre el que se lee: dominio INET, protocolo TCP (STREAM). */
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock < 0) {
		perror("error abriendo socket");
		exit(1);
	}

	/* Crear nombre, usamos INADDR_ANY para indicar que cualquiera puede enviar aquí. */
	name.sin_family = AF_INET;
	name.sin_addr.s_addr = INADDR_ANY;
	name.sin_port = htons(PORT);

	if (bind(sock, (void*) &name, sizeof(name))) {
		perror("error binding datagram socket");
		exit(1);
	}
	
	/*El socket esta listo para escuchar conexiones  */
	if (listen(sock, 5)) {
        	perror("Error escuchando");
        	exit(1);
    	}

	/*Aceptamos conexion entrante*/
	clientlen = sizeof(cli_addr);
	newsockfd = accept(sock, (struct sockaddr *) &cli_addr, &clientlen);
	if (newsockfd < 0) 
		perror("ERROR aceptando conexion");
			


	/* Recibimos mensajes hasta que alguno sea el que marca el final. */
	for (;;) {

		/*Recibimos del cliente*/
		n = recv(newsockfd, buf, MAX_MSG_LENGTH, 0);
		
		if (n < 0)
			perror("ERROR leyendo el socket");
		if(n==0)
			break;

		/*Salvamos el fd de la pantalla y fd de error*/

		int pantalla = dup(1);
		int error = dup(2);

		/*Copiamos los fd de pantalla y error en nuestro newsockfd*/
		dup2(newsockfd,1);
		dup2(newsockfd,2);
		
		/*Ejecutamos comando*/			
		system(buf);
		
		/*Recuperamos los fd*/
		dup2(pantalla,1);
		dup2(error,2);

		close(pantalla);
		close(error);


	}
	/* Cerrar sockets. */
	close(newsockfd);
	close(sock);
	return 0;
}

